package com.snack.common.page;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * PageShow的默认实现，获取前台显示的分页导航。 Copyright: Copyright (c) Feb 6, 2009 3:39:21 PM
 * Company: 北京宽连十方数字技术有限公司 Author: chengyao Modify: yangpeng 2009-07-23 17:33:15
 * Reason: 添加输入框和按钮，使得可以输入页数到达指定页面，并修改np函数 Version: 1.0 Modify: hexi 2012年05月5日
 * Reason: 调整对所有IE的支持,修改需要property框架支持,改为纯js,不需要引入 js 就可以直接使用 Version: 1.0
 */
public class DefaultPageShow implements PageShow {
	public String getPageIndex(ListPage<?> page) {
		int pageCount = Integer.valueOf(page.getPageCount());
		int curPage = Integer.valueOf(page.getCurPage());
		int recordCount = Integer.valueOf(page.getRecordCount());
		StringBuilder ret = new StringBuilder();
		ret.append("<div id=\"wp_page_numbers\">");
		ret.append("<ul>");
		if (pageCount >= 2) {
			Set<Integer> set = new HashSet<Integer>();
			set.add(Integer.valueOf(1));
			set.add(Integer.valueOf(2));
			set.add(Integer.valueOf(pageCount));
			set.add(Integer.valueOf(curPage));
			if (curPage > 3) {
				set.add(Integer.valueOf(curPage - 1));
			}
			if (curPage > 4) {
				set.add(Integer.valueOf(curPage - 2));
			}
			if (curPage < pageCount - 2) {
				set.add(Integer.valueOf(curPage + 1));
			}
			if (curPage < pageCount - 3) {
				set.add(Integer.valueOf(curPage + 2));
			}
			if (pageCount > 3) {
				set.add(Integer.valueOf(pageCount - 1));
			}
			List<Integer> list = new ArrayList<Integer>(set);
			Collections.sort(list);
			if (curPage > 1) {
				ret.append("<li>");
				ret.append("<a href=\"javascript:np(");
				ret.append(curPage - 1);
				ret.append(", ");
				ret.append(pageCount);
				//ret.append(");\">&lt;</a>");
				ret.append(");\">上一页</a>");
				ret.append("</li>");
			} else {
				//ret.append("<li class=\"no_link\">&lt;</li>");
				ret.append("<li class=\"no_link\">上一页</li>");
			}
			for (int i = 0; i < list.size(); i++) {
				Integer num = (Integer) list.get(i);
				if (ret.length() > 0) {
					ret.append(" ");
				}
				if (i > 1
						&& ((Integer) list.get(i)).intValue()
								- ((Integer) list.get(i - 1)).intValue() > 1) {
					ret.append("<li class=\"space\">...</li>");
				}
				ret.append(renderSingleLink(num.intValue(), curPage, pageCount));
			}
			if (curPage < pageCount) {
				ret.append("<li>");
				ret.append("<a href=\"javascript:np(");
				ret.append(curPage + 1);
				ret.append(", ");
				ret.append(pageCount);
				//ret.append(");\">&gt;</a>");
				ret.append(");\">下一页</a>");
				ret.append("</li>");
			} else {
				//ret.append("<li class=\"no_link\">&gt;</li>");
				ret.append("<li class=\"no_link\">下一页</li>");
			}
			// 添加输入框和按钮，使得可以输入页数到达指定页面 start
			ret.append("<li>");
			ret.append("<input type=\"text\" name=\"pageInx\" id=\"pageInx\" style=\"width:20px;height:13px\" maxlength=\"8\" />");
			ret.append("</li>");
			ret.append("<li>");
			ret.append("<a href=\"javascript:np(document.getElementById('pageInx').value, ");
			ret.append(pageCount);
			ret.append(");\">Go</a>");
			ret.append("</li>");
			// 添加输入框和按钮，使得可以输入页数到达指定页面 end
		}
		ret.append("<li class=\"page_info\">共");
		ret.append(recordCount);
		ret.append("条记录</li>");
		ret.append("</ul><div style=\"float: none; clear: both;\"></div></div>");
		ret.append(getScript(pageCount));
		return ret.toString();
	}

	/**
	 * 得到单个翻页显示的HTML代码
	 * 
	 * @param num
	 *            显示的跳转页数
	 * @param curPage
	 *            当前页
	 * @return HTML
	 */
	private String renderSingleLink(int num, int curPage, int pageCount) {
		StringBuilder sb = new StringBuilder();
		if (num == curPage) {
			sb.append("<li class=\"active_page\">");
			sb.append(num);
			sb.append("</li>");
		} else {
			sb.append("<li>");
			sb.append("<a href=\"javascript:np(").append(num);
			sb.append(", ").append(pageCount).append(");\">");
			sb.append(num).append("</a>");
			sb.append("</li>");
		}
		return sb.toString();
	}

	/**
	 * 得到翻页script脚本
	 * 
	 * @return script脚本
	 */
	private String getScript(int pageCount) {
		StringBuilder sb = new StringBuilder();
		if (pageCount >= 2) {
			sb.append("<script>");
			/**
			 * 事件building js 经过测试,意义不大,取消 sb.append(
			 * "Event.observe($('pageInx'), 'keydown', function(event) {");
			 * sb.append("if (event.keyCode == 13) {");
			 * sb.append("np($F('pageInx'), ").append(pageCount).append(");");
			 * sb.append("}"); sb.append("});");
			 */
			sb.append("function np(p, size) {");
			sb.append("var number = /^[0-9]+$/;");
			sb.append("if (!number.test(p)) {");
			sb.append("alert('请输入数字！');");
			sb.append("document.getElementById('pageInx').select();");
			sb.append("return;");
			sb.append("}");
			sb.append("if (p > size) {");
			sb.append("window.location = getRedirectURL('pageIndex', size);");
			sb.append("} else if (p < 1) {");
			sb.append("window.location = getRedirectURL('pageIndex', 1);");
			sb.append("} else {");
			sb.append("window.location = getRedirectURL('pageIndex', p);");
			sb.append("}");
			sb.append("}");
/**
 * 点击分页跳转函数,之前是在js里面。
 */
			sb.append(" function getRedirectURL(param,value,surl){  ");
			sb.append(" 		if(!surl){  ");
			sb.append(" surl=window.location.href;  ");
			sb.append(" 	}  ");
			sb.append(" 	var pos=surl.indexOf(\"#\");  ");
			sb.append(" 	if(pos!=-1){  ");
			sb.append(" 	surl=surl.substring(0,pos);  ");
			sb.append(" 	}  ");
			sb.append(" 	pos=surl.indexOf(\"?\");  ");
			sb.append(" 	if(pos==-1||pos==surl.length-1){  ");
			sb.append(" 		if(param!=null){  ");
			sb.append(" 			surl+=\"?\"+param+\"=\"+(value?value:\"\");  ");
			sb.append(" 	}  ");
			sb.append(" 	return surl;  ");
			sb.append(" 	}  ");
			sb.append(" 	var sNewURL=surl.substring(0,pos)+\"?\";  ");
			sb.append(" 	surl=surl.substring(pos+1);  ");
			sb.append(" 	var aParam=surl.split(\"&\");  ");
			sb.append(" 	var bParamFound=false;  ");
			sb.append(" 	var bFirstParam=true;  ");
			sb.append(" 	for(var i=0;i<aParam.length;i++){  ");
			sb.append(" 	if(aParam[i].length==0||aParam[i].indexOf(\"=\")==-1){  ");
			sb.append(" 		continue;  ");
			sb.append(" 	}  ");
			sb.append(" 	else if(param==null){  ");
			sb.append(" 	sNewURL+=(bFirstParam?\"\":\"&\")+aParam[i];  ");
			sb.append(" 		}  ");
			sb.append(" 	else if(aParam[i].toUpperCase().indexOf(param.toUpperCase()+\"=\")==0){  ");
			sb.append(" 		sNewURL+=(bFirstParam?\"\":\"&\")+param+\"=\"+(value?value:\"\");  ");
			sb.append(" 		bParamFound=true;  ");
			sb.append(" 	}  ");
			sb.append(" 	else{  ");
			sb.append(" 		sNewURL+=(bFirstParam?\"\":\"&\")+aParam[i];  ");
			sb.append(" 		}  ");
			sb.append(" 		bFirstParam=false;  ");
			sb.append(" 	}  ");
			sb.append(" 	if(!bParamFound&&param){  ");
			sb.append(" 		sNewURL+=\"&\"+param+\"=\"+(value?value:\"\");  ");
			sb.append(" 		}  ");
			sb.append(" 		return sNewURL;  ");
			sb.append(" 	}  ");

			sb.append("</script>");
		}
		return sb.toString();
	}
}